/**
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "AccessingFiledsOfObjects.h"
#include "AccessingStaticFields.h"
#include "CallingInstanceMethods.h"
#include "Common.h"
#include "ClassOperations.h"
#include "Exceptions.h"
#include "GlobalAndLocalReferences.h"
#include "ObjectOperations.h"
#include "VersionInfo.h"
#include "ClassCallingStaticMethods.h"
#include "StringOperations.h"
#include "ArrayOperations.h"
#include "ScopeSupport.h"
#include "JSFeature.h"
#include "EnvOperations.h"
#include "EnumOperations.h"
#include "ModuleSupport.h"
#include "NameSpaceSupport.h"
#include "TupleOperations.h"
#include "VariableOperations.h"
#include "VmOps.h"
#include "Promise.h"
#include "WeakGlobalReferences.h"

namespace {
    std::array methods = {
        ani_native_function{"test_GetVersion", ":I",
                            reinterpret_cast<void *>(test_GetVersion)},
        ani_native_function{"test_FindClass", ":Z",
                            reinterpret_cast<void *>(test_FindClass)},
        ani_native_function{"test_Class_FindStaticMethodBoolean", ":Z",
                            reinterpret_cast<void *>(test_Class_FindStaticMethodBoolean)},
        ani_native_function{"test_Class_FindStaticMethodInt", ":Z",
                            reinterpret_cast<void *>(test_Class_FindStaticMethodInt)},
        ani_native_function{"test_GlobalReference_Create", ":Z",
                            reinterpret_cast<void *>(test_GlobalReference_Create)},
        ani_native_function{"test_ExistUnhandledError", ":Z",
                            reinterpret_cast<void *>(test_ExistUnhandledError)},
        ani_native_function{"test_ResetError", ":Z",
                            reinterpret_cast<void *>(test_ResetError)},
        ani_native_function{"test_Class_FindMethod", ":Z",
                            reinterpret_cast<void *>(test_Class_FindMethod)},
        ani_native_function{"test_Class_BindNativeMethods", ":Z",
                            reinterpret_cast<void *>(test_Class_BindNativeMethods)},
        ani_native_function{"test_Type_GetSuperClass", ":Z",
                            reinterpret_cast<void *>(test_Type_GetSuperClass)},
        ani_native_function{"test_Type_IsAssignableFrom", ":Z",
                            reinterpret_cast<void *>(test_Type_IsAssignableFrom)},
        ani_native_function{"test_FindModule", ":Z",
                            reinterpret_cast<void *>(test_FindModule)},
        ani_native_function{"test_FindNamespace", ":Z",
                            reinterpret_cast<void *>(test_FindNamespace)},
        ani_native_function{"test_FindEnum", ":Z",
                            reinterpret_cast<void *>(test_FindEnum)},
        ani_native_function{"test_GlobalReference_Create", ":Z",
                            reinterpret_cast<void *>(test_GlobalReference_Create)},
        ani_native_function{"test_Reference_StrictEquals", ":Z",
                            reinterpret_cast<void *>(test_Reference_StrictEquals)},
        ani_native_function{"test_GlobalReference_Delete", ":Z",
                            reinterpret_cast<void *>(test_GlobalReference_Delete)},
        ani_native_function{"test_Reference_Delete", ":Z",
                            reinterpret_cast<void *>(test_Reference_Delete)},
        ani_native_function{"test_EnsureEnoughReferences", ":Z",
                            reinterpret_cast<void *>(test_EnsureEnoughReferences)},
        ani_native_function{"test_Object_InstanceOf", ":Z",
                            reinterpret_cast<void *>(test_Object_InstanceOf)},
        ani_native_function{"test_Object_GetType", ":Z",
                            reinterpret_cast<void *>(test_Object_GetType)},
        ani_native_function{"test_Object_New", ":Z",
                            reinterpret_cast<void *>(test_Object_New)},
        ani_native_function{"test_Reference_IsNull", ":Z",
                            reinterpret_cast<void *>(test_Reference_IsNull)},
        ani_native_function{"test_Reference_IsUndefined", ":Z",
                            reinterpret_cast<void *>(test_Reference_IsUndefined)},
        ani_native_function{"test_Reference_IsNullishValue", ":Z",
                            reinterpret_cast<void *>(test_Reference_IsNullishValue)},
        ani_native_function{"test_Reference_Equals", ":Z",
                            reinterpret_cast<void *>(test_Reference_Equals)},
        ani_native_function{"test_Array_New_Ref", ":Z",
                            reinterpret_cast<void *>(test_Array_New_Ref)},
        ani_native_function{"test_Object_New_A", ":Z",
                            reinterpret_cast<void *>(test_Object_New_A)},
        ani_native_function{"test_Object_New_V", ":Z",
                            reinterpret_cast<void *>(test_Object_New_V)},
        ani_native_function{"test_Class_GetStaticField_Boolean", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticField_Boolean)},
        ani_native_function{"test_Class_GetStaticField_Char", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticField_Char)},
        ani_native_function{"test_Class_GetStaticField_Byte", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticField_Byte)},
        ani_native_function{"test_Class_GetStaticField_Short", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticField_Short)},
        ani_native_function{"test_Class_GetStaticField_Int", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticField_Int)},
        ani_native_function{"test_Class_GetStaticField_Long", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticField_Long)},
        ani_native_function{"test_Class_GetStaticField_Float", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticField_Float)},
        ani_native_function{"test_Class_GetStaticField_Double", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticField_Double)},
        ani_native_function{"test_Class_GetStaticField_Ref", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticField_Ref)},
        ani_native_function{"test_Class_SetStaticField_Boolean", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticField_Boolean)},
        ani_native_function{"test_Class_SetStaticField_Char", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticField_Char)},
        ani_native_function{"test_Class_SetStaticField_Byte", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticField_Byte)},
        ani_native_function{"test_Class_SetStaticField_Short", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticField_Short)},
        ani_native_function{"test_Class_SetStaticField_Int", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticField_Int)},
        ani_native_function{"test_Class_SetStaticField_Long", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticField_Long)},
        ani_native_function{"test_Class_SetStaticField_Float", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticField_Float)},
        ani_native_function{"test_Class_SetStaticField_Double", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticField_Double)},
        ani_native_function{"test_Class_SetStaticField_Ref", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticField_Ref)},
        ani_native_function{"test_Class_GetStaticFieldByName_Boolean", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticFieldByName_Boolean)},
        ani_native_function{"test_Class_GetStaticFieldByName_Char", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticFieldByName_Char)},
        ani_native_function{"test_Class_GetStaticFieldByName_Byte", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticFieldByName_Byte)},
        ani_native_function{"test_Class_GetStaticFieldByName_Short", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticFieldByName_Short)},
        ani_native_function{"test_Class_GetStaticFieldByName_Int", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticFieldByName_Int)},
        ani_native_function{"test_Class_GetStaticFieldByName_Long", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticFieldByName_Long)},
        ani_native_function{"test_Class_GetStaticFieldByName_Float", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticFieldByName_Float)},
        ani_native_function{"test_Class_GetStaticFieldByName_Double", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticFieldByName_Double)},
        ani_native_function{"test_Class_GetStaticFieldByName_Ref", ":Z",
                            reinterpret_cast<void *>(test_Class_GetStaticFieldByName_Ref)},
        ani_native_function{"test_Class_SetStaticFieldByName_Boolean", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticFieldByName_Boolean)},
        ani_native_function{"test_Class_SetStaticFieldByName_Char", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticFieldByName_Char)},
        ani_native_function{"test_Class_SetStaticFieldByName_Byte", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticFieldByName_Byte)},
        ani_native_function{"test_Class_SetStaticFieldByName_Short", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticFieldByName_Short)},
        ani_native_function{"test_Class_SetStaticFieldByName_Int", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticFieldByName_Int)},
        ani_native_function{"test_Class_SetStaticFieldByName_Long", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticFieldByName_Long)},
        ani_native_function{"test_Class_SetStaticFieldByName_Float", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticFieldByName_Float)},
        ani_native_function{"test_Class_SetStaticFieldByName_Double", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticFieldByName_Double)},
        ani_native_function{"test_Class_SetStaticFieldByName_Ref", ":Z",
                            reinterpret_cast<void *>(test_Class_SetStaticFieldByName_Ref)},
        ani_native_function{"test_Class_CallStaticMethodByName_Boolean", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Boolean)},
        ani_native_function{"test_Class_CallStaticMethodByName_Boolean_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Boolean_A)},
        ani_native_function{"test_Class_CallStaticMethodByName_Boolean_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Boolean_V)},
        ani_native_function{"test_Class_CallStaticMethodByName_Char", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Char)},
        ani_native_function{"test_Class_CallStaticMethodByName_Char_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Char_A)},
        ani_native_function{"test_Class_CallStaticMethodByName_Char_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Char_V)},
        ani_native_function{"test_Class_CallStaticMethodByName_Byte", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Byte)},
        ani_native_function{"test_Class_CallStaticMethodByName_Byte_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Byte_A)},
        ani_native_function{"test_Class_CallStaticMethodByName_Byte_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Byte_V)},
        ani_native_function{"test_Class_CallStaticMethodByName_Short", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Short)},
        ani_native_function{"test_Class_CallStaticMethodByName_Short_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Short_A)},
        ani_native_function{"test_Class_CallStaticMethodByName_Short_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Short_V)},
        ani_native_function{"test_Class_CallStaticMethodByName_Int", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Int)},
        ani_native_function{"test_Class_CallStaticMethodByName_Int_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Int_A)},
        ani_native_function{"test_Class_CallStaticMethodByName_Int_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Int_V)},
        ani_native_function{"test_Class_CallStaticMethodByName_Long", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Long)},
        ani_native_function{"test_Class_CallStaticMethodByName_Long_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Long_A)},
        ani_native_function{"test_Class_CallStaticMethodByName_Long_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Long_V)},
        ani_native_function{"test_Class_CallStaticMethodByName_Float", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Float)},
        ani_native_function{"test_Class_CallStaticMethodByName_Float_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Float_A)},
        ani_native_function{"test_Class_CallStaticMethodByName_Float_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Float_V)},
        ani_native_function{"test_Class_CallStaticMethodByName_Double", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Double)},
        ani_native_function{"test_Class_CallStaticMethodByName_Double_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Double_A)},
        ani_native_function{"test_Class_CallStaticMethodByName_Double_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Double_V)},
        ani_native_function{"test_Class_CallStaticMethodByName_Ref", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Ref)},
        ani_native_function{"test_Class_CallStaticMethodByName_Ref_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Ref_A)},
        ani_native_function{"test_Class_CallStaticMethodByName_Ref_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Ref_V)},
        ani_native_function{"test_Class_CallStaticMethodByName_Void", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Void)},
        ani_native_function{"test_Class_CallStaticMethodByName_Void_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Void_A)},
        ani_native_function{"test_Class_CallStaticMethodByName_Void_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethodByName_Void_V)},
        ani_native_function{"test_Class_CallStaticMethod_Short", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Short)},
        ani_native_function{"test_Class_CallStaticMethod_Short_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Short_A)},
        ani_native_function{"test_Class_CallStaticMethod_Short_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Short_V)},
        ani_native_function{"test_Class_CallStaticMethod_Int", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Int)},
        ani_native_function{"test_Class_CallStaticMethod_Int_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Int_A)},
        ani_native_function{"test_Class_CallStaticMethod_Int_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Int_V)},
        ani_native_function{"test_Object_SetProperty_Boolean", ":Z",
                            reinterpret_cast<void *>(test_Object_SetProperty_Boolean)},
        ani_native_function{"test_Object_SetProperty_Char", ":Z",
                            reinterpret_cast<void *>(test_Object_SetProperty_Char)},
        ani_native_function{"test_Object_SetProperty_Byte", ":Z",
                            reinterpret_cast<void *>(test_Object_SetProperty_Byte)},
        ani_native_function{"test_Object_SetProperty_Short", ":Z",
                            reinterpret_cast<void *>(test_Object_SetProperty_Short)},
        ani_native_function{"test_Object_SetProperty_Int", ":Z",
                            reinterpret_cast<void *>(test_Object_SetProperty_Int)},
        ani_native_function{"test_Object_SetProperty_Long", ":Z",
                            reinterpret_cast<void *>(test_Object_SetProperty_Long)},
        ani_native_function{"test_Object_SetProperty_Float", ":Z",
                            reinterpret_cast<void *>(test_Object_SetProperty_Float)},
        ani_native_function{"test_Object_SetProperty_Double", ":Z",
                            reinterpret_cast<void *>(test_Object_SetProperty_Double)},
        ani_native_function{"test_Object_SetProperty_Ref", ":Z",
                            reinterpret_cast<void *>(test_Object_SetProperty_Ref)},
        ani_native_function{"test_Object_GetPropertyByName_Boolean", ":Z",
                            reinterpret_cast<void *>(test_Object_GetPropertyByName_Boolean)},
        ani_native_function{"test_Object_GetPropertyByName_Char", ":Z",
                            reinterpret_cast<void *>(test_Object_GetPropertyByName_Char)},
        ani_native_function{"test_Object_GetPropertyByName_Byte", ":Z",
                            reinterpret_cast<void *>(test_Object_GetPropertyByName_Byte)},
        ani_native_function{"test_Object_GetPropertyByName_Short", ":Z",
                            reinterpret_cast<void *>(test_Object_GetPropertyByName_Short)},
        ani_native_function{"test_Object_GetPropertyByName_Int", ":Z",
                            reinterpret_cast<void *>(test_Object_GetPropertyByName_Int)},
        ani_native_function{"test_Object_GetPropertyByName_Long", ":Z",
                            reinterpret_cast<void *>(test_Object_GetPropertyByName_Long)},
        ani_native_function{"test_Object_GetPropertyByName_Float", ":Z",
                            reinterpret_cast<void *>(test_Object_GetPropertyByName_Float)},
        ani_native_function{"test_Object_GetPropertyByName_Double", ":Z",
                            reinterpret_cast<void *>(test_Object_GetPropertyByName_Double)},
        ani_native_function{"test_Object_GetPropertyByName_Ref", ":Z",
                            reinterpret_cast<void *>(test_Object_GetPropertyByName_Ref)},
        ani_native_function{"test_Class_FindField", ":Z",
                            reinterpret_cast<void *>(test_Class_FindField)},
        ani_native_function{"test_Class_FindSetter", ":Z",
                            reinterpret_cast<void *>(test_Class_FindSetter)},
        ani_native_function{"test_Class_FindGetter", ":Z",
                            reinterpret_cast<void *>(test_Class_FindGetter)},
        ani_native_function{"test_Class_FindIndexableGetter", ":Z",
                            reinterpret_cast<void *>(test_Class_FindIndexableGetter)},
        ani_native_function{"test_Class_FindIndexableSetter", ":Z",
                            reinterpret_cast<void *>(test_Class_FindIndexableSetter)},
        ani_native_function{"test_Class_FindIterator", ":Z",
                            reinterpret_cast<void *>(test_Class_FindIterator)},
        ani_native_function{"test_Object_GetField_Boolean", ":Z",
                            reinterpret_cast<void *>(test_Object_GetField_Boolean)},
        ani_native_function{"test_Object_GetField_Char", ":Z",
                            reinterpret_cast<void *>(test_Object_GetField_Char)},
        ani_native_function{"test_Object_GetField_Byte", ":Z",
                            reinterpret_cast<void *>(test_Object_GetField_Byte)},
        ani_native_function{"test_Object_GetField_Short", ":Z",
                            reinterpret_cast<void *>(test_Object_GetField_Short)},
        ani_native_function{"test_Object_GetField_Int", ":Z",
                            reinterpret_cast<void *>(test_Object_GetField_Int)},
        ani_native_function{"test_Object_GetField_Long", ":Z",
                            reinterpret_cast<void *>(test_Object_GetField_Long)},
        ani_native_function{"test_Object_GetField_Float", ":Z",
                            reinterpret_cast<void *>(test_Object_GetField_Float)},
        ani_native_function{"test_Object_GetField_Double", ":Z",
                            reinterpret_cast<void *>(test_Object_GetField_Double)},
        ani_native_function{"test_Object_GetField_Ref", ":Z",
                            reinterpret_cast<void *>(test_Object_GetField_Ref)},
        ani_native_function{"test_Object_SetField_Boolean", ":Z",
                            reinterpret_cast<void *>(test_Object_SetField_Boolean)},
        ani_native_function{"test_Object_SetField_Char", ":Z",
                            reinterpret_cast<void *>(test_Object_SetField_Char)},
        ani_native_function{"test_Object_SetField_Byte", ":Z",
                            reinterpret_cast<void *>(test_Object_SetField_Byte)},
        ani_native_function{"test_Object_SetField_Short", ":Z",
                            reinterpret_cast<void *>(test_Object_SetField_Short)},
        ani_native_function{"test_Object_SetField_Int", ":Z",
                            reinterpret_cast<void *>(test_Object_SetField_Int)},
        ani_native_function{"test_Object_SetField_Long", ":Z",
                            reinterpret_cast<void *>(test_Object_SetField_Long)},
        ani_native_function{"test_Object_SetField_Float", ":Z",
                            reinterpret_cast<void *>(test_Object_SetField_Float)},
        ani_native_function{"test_Object_SetField_Double", ":Z",
                            reinterpret_cast<void *>(test_Object_SetField_Double)},
        ani_native_function{"test_Object_SetField_Ref", ":Z",
                            reinterpret_cast<void *>(test_Object_SetField_Ref)},
        ani_native_function{"test_Object_GetFieldByName_Boolean", ":Z",
                            reinterpret_cast<void *>(test_Object_GetFieldByName_Boolean)},
        ani_native_function{"test_Object_GetFieldByName_Char", ":Z",
                            reinterpret_cast<void *>(test_Object_GetFieldByName_Char)},
        ani_native_function{"test_Object_GetFieldByName_Byte", ":Z",
                            reinterpret_cast<void *>(test_Object_GetFieldByName_Byte)},
        ani_native_function{"test_Object_GetFieldByName_Short", ":Z",
                            reinterpret_cast<void *>(test_Object_GetFieldByName_Short)},
        ani_native_function{"test_Object_GetFieldByName_Int", ":Z",
                            reinterpret_cast<void *>(test_Object_GetFieldByName_Int)},
        ani_native_function{"test_Object_GetFieldByName_Long", ":Z",
                            reinterpret_cast<void *>(test_Object_GetFieldByName_Long)},
        ani_native_function{"test_Object_GetFieldByName_Float", ":Z",
                            reinterpret_cast<void *>(test_Object_GetFieldByName_Float)},
        ani_native_function{"test_Object_GetFieldByName_Double", ":Z",
                            reinterpret_cast<void *>(test_Object_GetFieldByName_Double)},
        ani_native_function{"test_Object_GetFieldByName_Ref", ":Z",
                            reinterpret_cast<void *>(test_Object_GetFieldByName_Ref)},
        ani_native_function{"test_Object_SetFieldByName_Boolean", ":Z",
                            reinterpret_cast<void *>(test_Object_SetFieldByName_Boolean)},
        ani_native_function{"test_Object_SetFieldByName_Char", ":Z",
                            reinterpret_cast<void *>(test_Object_SetFieldByName_Char)},
        ani_native_function{"test_Object_SetFieldByName_Byte", ":Z",
                            reinterpret_cast<void *>(test_Object_SetFieldByName_Byte)},
        ani_native_function{"test_Object_SetFieldByName_Short", ":Z",
                            reinterpret_cast<void *>(test_Object_SetFieldByName_Short)},
        ani_native_function{"test_Object_SetFieldByName_Int", ":Z",
                            reinterpret_cast<void *>(test_Object_SetFieldByName_Int)},
        ani_native_function{"test_Object_SetFieldByName_Long", ":Z",
                            reinterpret_cast<void *>(test_Object_SetFieldByName_Long)},
        ani_native_function{"test_Object_SetFieldByName_Float", ":Z",
                            reinterpret_cast<void *>(test_Object_SetFieldByName_Float)},
        ani_native_function{"test_Object_SetFieldByName_Double", ":Z",
                            reinterpret_cast<void *>(test_Object_SetFieldByName_Double)},
        ani_native_function{"test_Object_SetFieldByName_Ref", ":Z",
                            reinterpret_cast<void *>(test_Object_SetFieldByName_Ref)},
        ani_native_function{"test_Class_CallStaticMethod_Double", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Double)},
        ani_native_function{"test_Class_CallStaticMethod_Double_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Double_A)},
        ani_native_function{"test_Class_CallStaticMethod_Double_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Double_V)},
        ani_native_function{"test_Class_CallStaticMethod_Void", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Void)},
        ani_native_function{"test_Class_CallStaticMethod_Void_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Void_A)},
        ani_native_function{"test_Class_CallStaticMethod_Void_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Void_V)},
        ani_native_function{"test_String_UTF8", ":Z",
                            reinterpret_cast<void *>(test_String_UTF8)},
        ani_native_function{"test_String_UTF16", ":Z",
                            reinterpret_cast<void *>(test_String_UTF16)},
        ani_native_function{"test_array_region_byte", ":Z",
                            reinterpret_cast<void *>(test_array_region_byte)},
        ani_native_function{"test_array_region_char", ":Z",
                            reinterpret_cast<void *>(test_array_region_char)},
        ani_native_function{"test_array_region_boolean", ":Z",
                            reinterpret_cast<void *>(test_array_region_boolean)},
        ani_native_function{"test_array_region_double", ":Z",
                            reinterpret_cast<void *>(test_array_region_double)},
        ani_native_function{"test_array_region_float", ":Z",
                            reinterpret_cast<void *>(test_array_region_float)},
        ani_native_function{"test_array_region_int", ":Z",
                            reinterpret_cast<void *>(test_array_region_int)},
        ani_native_function{"test_array_region_long", ":Z",
                            reinterpret_cast<void *>(test_array_region_long)},
        ani_native_function{"test_array_region_short", ":Z",
                            reinterpret_cast<void *>(test_array_region_short)},
        ani_native_function{"test_array_set_with_get_ref", ":Z",
                            reinterpret_cast<void *>(test_array_set_with_get_ref)},
        ani_native_function{"test_array_getLength", ":Z",
                            reinterpret_cast<void *>(test_array_getLength)},
        ani_native_function{"test_array_CreateBuffer", ":Z",
                            reinterpret_cast<void *>(test_array_CreateBuffer)},
        ani_native_function{"test_create_local_scope", ":Z",
                            reinterpret_cast<void *>(test_create_local_scope)},
        ani_native_function{"test_create_escape_local_scope", ":Z",
                            reinterpret_cast<void *>(test_create_escape_local_scope)},
        ani_native_function{"test_getNull", ":Z",
                            reinterpret_cast<void *>(test_getNull)},
        ani_native_function{"test_getUndefined", ":Z",
                            reinterpret_cast<void *>(test_getUndefined)},
        ani_native_function{"test_getEnv", ":Z",
                            reinterpret_cast<void *>(test_getEnv)},
        ani_native_function{"test_Class_CallStaticMethod_Long", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Long)},
        ani_native_function{"test_Class_CallStaticMethod_Float", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Float)},
        ani_native_function{"test_Object_CallMethod_Double", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Double)},
        ani_native_function{"test_Object_CallMethod_Double_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Double_A)},
        ani_native_function{"test_Object_CallMethod_Double_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Double_V)},
        ani_native_function{"test_Object_CallMethod_Int", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Int)},
        ani_native_function{"test_Object_CallMethod_Int_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Int_A)},
        ani_native_function{"test_Object_CallMethod_Int_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Int_V)},
        ani_native_function{"test_Object_CallMethod_Boolean", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Boolean)},
        ani_native_function{"test_Object_CallMethod_Boolean_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Boolean_A)},
        ani_native_function{"test_Object_CallMethod_Boolean_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Boolean_V)},
        ani_native_function{"test_Object_CallMethod_Void", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Void)},
        ani_native_function{"test_Object_CallMethod_Void_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Void_A)},
        ani_native_function{"test_Object_CallMethod_Void_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Void_V)},
        ani_native_function{"test_Object_CallMethod_Long", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Long)},
        ani_native_function{"test_Object_CallMethod_Long_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Long_A)},
        ani_native_function{"test_Object_CallMethod_Long_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Long_V)},
        ani_native_function{"test_Object_CallMethod_Char", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Char)},
        ani_native_function{"test_Object_CallMethod_Char_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Char_A)},
        ani_native_function{"test_Object_CallMethod_Char_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Char_V)},
        ani_native_function{"test_Object_CallMethod_Byte", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Byte)},
        ani_native_function{"test_Object_CallMethod_Byte_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Byte_A)},
        ani_native_function{"test_Object_CallMethod_Byte_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Byte_V)},
        ani_native_function{"test_Object_CallMethod_Short", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Short)},
        ani_native_function{"test_Object_CallMethod_Short_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Short_A)},
        ani_native_function{"test_Object_CallMethod_Short_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Short_V)},
        ani_native_function{"test_Object_CallMethod_Float", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Float)},
        ani_native_function{"test_Object_CallMethod_Float_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Float_A)},
        ani_native_function{"test_Object_CallMethod_Float_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Float_V)},
        ani_native_function{"test_Object_CallMethod_Ref", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Ref)},
        ani_native_function{"test_Object_CallMethod_Ref_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Ref_A)},
        ani_native_function{"test_Object_CallMethod_Ref_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethod_Ref_V)},
        ani_native_function{"test_Object_CallMethodByName_Boolean", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Boolean)},
        ani_native_function{"test_Object_CallMethodByName_Boolean_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Boolean_A)},
        ani_native_function{"test_Object_CallMethodByName_Boolean_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Boolean_V)},
        ani_native_function{"test_Object_CallMethodByName_Char", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Char)},
        ani_native_function{"test_Object_CallMethodByName_Char_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Char_A)},
        ani_native_function{"test_Object_CallMethodByName_Char_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Char_V)},
        ani_native_function{"test_Object_CallMethodByName_Byte", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Byte)},
        ani_native_function{"test_Object_CallMethodByName_Byte_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Byte_A)},
        ani_native_function{"test_Object_CallMethodByName_Byte_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Byte_V)},
        ani_native_function{"test_Object_CallMethodByName_Short", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Short)},
        ani_native_function{"test_Object_CallMethodByName_Short_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Short_A)},
        ani_native_function{"test_Object_CallMethodByName_Short_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Short_V)},
        ani_native_function{"test_Object_CallMethodByName_Int", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Int)},
        ani_native_function{"test_Object_CallMethodByName_Int_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Int_A)},
        ani_native_function{"test_Object_CallMethodByName_Int_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Int_V)},
        ani_native_function{"test_Object_CallMethodByName_Long", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Long)},
        ani_native_function{"test_Object_CallMethodByName_Long_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Long_A)},
        ani_native_function{"test_Object_CallMethodByName_Long_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Long_V)},
        ani_native_function{"test_Object_CallMethodByName_Float", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Float)},
        ani_native_function{"test_Object_CallMethodByName_Float_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Float_A)},
        ani_native_function{"test_Object_CallMethodByName_Float_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Float_V)},
        ani_native_function{"test_Object_CallMethodByName_Double", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Double)},
        ani_native_function{"test_Object_CallMethodByName_Double_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Double_A)},
        ani_native_function{"test_Object_CallMethodByName_Double_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Double_V)},
        ani_native_function{"test_Object_CallMethodByName_Ref", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Ref)},
        ani_native_function{"test_Object_CallMethodByName_Ref_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Ref_A)},
        ani_native_function{"test_Object_CallMethodByName_Ref_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Ref_V)},
        ani_native_function{"test_Object_CallMethodByName_Void", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Void)},
        ani_native_function{"test_Object_CallMethodByName_Void_A", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Void_A)},
        ani_native_function{"test_Object_CallMethodByName_Void_V", ":Z",
                            reinterpret_cast<void *>(test_Object_CallMethodByName_Void_V)},
        ani_native_function{"test_Function_Call_Boolean", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Boolean)},
        ani_native_function{"test_Function_Call_Boolean_A", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Boolean_A)},
        ani_native_function{"test_Function_Call_Boolean_V", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Boolean_V)},
        ani_native_function{"test_Function_Call_Char", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Char)},
        ani_native_function{"test_Function_Call_Char_A", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Char_A)},
        ani_native_function{"test_Function_Call_Char_V", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Char_V)},
        ani_native_function{"test_Function_Call_Byte", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Byte)},
        ani_native_function{"test_Function_Call_Byte_A", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Byte_A)},
        ani_native_function{"test_Function_Call_Byte_V", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Byte_V)},
        ani_native_function{"test_Function_Call_Short", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Short)},
        ani_native_function{"test_Function_Call_Short_A", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Short_A)},
        ani_native_function{"test_Function_Call_Short_V", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Short_V)},
        ani_native_function{"test_Function_Call_Int", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Int)},
        ani_native_function{"test_Function_Call_Int_A", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Int_A)},
        ani_native_function{"test_Function_Call_Int_V", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Int_V)},
        ani_native_function{"test_Function_Call_Long", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Long)},
        ani_native_function{"test_Function_Call_Long_A", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Long_A)},
        ani_native_function{"test_Function_Call_Long_V", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Long_V)},
        ani_native_function{"test_Function_Call_Float", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Float)},
        ani_native_function{"test_Function_Call_Float_A", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Float_A)},
        ani_native_function{"test_Function_Call_Float_V", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Float_V)},
        ani_native_function{"test_Function_Call_Double", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Double)},
        ani_native_function{"test_Function_Call_Double_A", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Double_A)},
        ani_native_function{"test_Function_Call_Double_V", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Double_V)},
        ani_native_function{"test_Function_Call_Ref", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Ref)},
        ani_native_function{"test_Function_Call_Ref_A", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Ref_A)},
        ani_native_function{"test_Function_Call_Ref_V", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Ref_V)},
        ani_native_function{"test_Function_Call_Void", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Void)},
        ani_native_function{"test_Function_Call_Void_A", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Void_A)},
        ani_native_function{"test_Function_Call_Void_V", ":Z",
                            reinterpret_cast<void *>(test_Function_Call_Void_V)},
        ani_native_function{"test_FunctionalObject_Call", ":Z",
                            reinterpret_cast<void *>(test_FunctionalObject_Call)},
        ani_native_function{"test_Module_BindNativeFunctions", ":Z",
                            reinterpret_cast<void *>(test_Module_BindNativeFunctions)},
        ani_native_function{"test_Namespace_BindNativeFunctions", ":Z",
                            reinterpret_cast<void *>(test_Namespace_BindNativeFunctions)},
        ani_native_function{"test_Class_CallStaticMethod_Char", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Char)},
        ani_native_function{"test_Class_CallStaticMethod_Char_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Char_A)},
        ani_native_function{"test_Class_CallStaticMethod_Char_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Char_V)},
        ani_native_function{"test_Class_CallStaticMethod_Byte", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Byte)},
        ani_native_function{"test_Class_CallStaticMethod_Byte_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Byte_A)},
        ani_native_function{"test_Class_CallStaticMethod_Byte_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Byte_V)},
        ani_native_function{"test_Class_CallStaticMethod_Ref", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Ref)},
        ani_native_function{"test_Class_CallStaticMethod_Ref_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Ref_V)},
        ani_native_function{"test_Class_CallStaticMethod_Ref_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Ref_A)},
        ani_native_function{"test_Class_CallStaticMethod_Boolean", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Boolean)},
        ani_native_function{"test_Class_CallStaticMethod_Boolean_A", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Boolean_A)},
        ani_native_function{"test_Class_CallStaticMethod_Boolean_V", ":Z",
                            reinterpret_cast<void *>(test_Class_CallStaticMethod_Boolean_V)},
        ani_native_function{"test_Variable_SetValue_Long", ":Z", reinterpret_cast<void *>(test_Variable_SetValue_Long)},
        ani_native_function{"test_Variable_SetValue_Int", ":Z", reinterpret_cast<void *>(test_Variable_SetValue_Int)},
        ani_native_function{"test_Variable_SetValue_Double", ":Z",
                            reinterpret_cast<void *>(test_Variable_SetValue_Double)},
        ani_native_function{"test_Variable_GetValue_Ref", ":Z", reinterpret_cast<void *>(test_Variable_GetValue_Ref)},
        ani_native_function{"test_Variable_GetValue_Double", ":Z",
                            reinterpret_cast<void *>(test_Variable_GetValue_Double)},
        ani_native_function{"test_Variable_GetValue_Boolean", ":Z",
                            reinterpret_cast<void *>(test_Variable_GetValue_Boolean)},
        ani_native_function{"test_Variable_GetValue_Int", ":Z", reinterpret_cast<void *>(test_Variable_GetValue_Int)},
        ani_native_function{"test_Variable_GetValue_Long", ":Z", reinterpret_cast<void *>(test_Variable_GetValue_Long)},
        ani_native_function{"test_Namespace_FindVariable", ":Z", reinterpret_cast<void *>(test_Namespace_FindVariable)},
        ani_native_function{"test_Variable_SetValue_Boolean", ":Z",
                            reinterpret_cast<void *>(test_Variable_SetValue_Boolean)},
        ani_native_function{"test_Variable_SetValue_Char", ":Z", reinterpret_cast<void *>(test_Variable_SetValue_Char)},
        ani_native_function{"test_Variable_SetValue_Byte", ":Z", reinterpret_cast<void *>(test_Variable_SetValue_Byte)},
        ani_native_function{"test_Variable_SetValue_Short", ":Z",
                            reinterpret_cast<void *>(test_Variable_SetValue_Short)},
        ani_native_function{"test_Variable_SetValue_Float", ":Z",
                            reinterpret_cast<void *>(test_Variable_SetValue_Float)},
        ani_native_function{"test_Variable_SetValue_Ref", ":Z", reinterpret_cast<void *>(test_Variable_SetValue_Ref)},
        ani_native_function{"test_Variable_GetValue_Char", ":Z", reinterpret_cast<void *>(test_Variable_GetValue_Char)},
        ani_native_function{"test_Variable_GetValue_Byte", ":Z", reinterpret_cast<void *>(test_Variable_GetValue_Byte)},
        ani_native_function{"test_Variable_GetValue_Short", ":Z",
                            reinterpret_cast<void *>(test_Variable_GetValue_Short)},
        ani_native_function{"test_Variable_GetValue_Float", ":Z",
                            reinterpret_cast<void *>(test_Variable_GetValue_Float)},
        ani_native_function{"test_Module_FindNamespace", ":Z", reinterpret_cast<void *>(test_Module_FindNamespace)},
        ani_native_function{"test_Module_FindClass", ":Z", reinterpret_cast<void *>(test_Module_FindClass)},
        ani_native_function{"test_Module_FindEnum", ":Z", reinterpret_cast<void *>(test_Module_FindEnum)},
        ani_native_function{"test_Module_FindFunction", ":Z", reinterpret_cast<void *>(test_Module_FindFunction)},
        ani_native_function{"test_Module_FindVariable", ":Z", reinterpret_cast<void *>(test_Module_FindVariable)},
        ani_native_function{"test_Namespace_FindNamespace", ":Z",
                            reinterpret_cast<void *>(test_Namespace_FindNamespace)},
        ani_native_function{"test_Namespace_FindClass", ":Z", reinterpret_cast<void *>(test_Namespace_FindClass)},
        ani_native_function{"test_Namespace_FindEnum", ":Z", reinterpret_cast<void *>(test_Namespace_FindEnum)},
        ani_native_function{"test_Namespace_FindFunction", ":Z", reinterpret_cast<void *>(test_Namespace_FindFunction)},
        ani_native_function{"test_Enum_GetEnumItemByName", ":Z", reinterpret_cast<void *>(test_Enum_GetEnumItemByName)},
        ani_native_function{"test_Enum_GetEnumItemByIndex", ":Z",
                            reinterpret_cast<void *>(test_Enum_GetEnumItemByIndex)},
        ani_native_function{"test_EnumItem_GetEnum", ":Z", reinterpret_cast<void *>(test_EnumItem_GetEnum)},
        ani_native_function{"test_EnumItem_GetValue_Int", ":Z", reinterpret_cast<void *>(test_EnumItem_GetValue_Int)},
        ani_native_function{"test_EnumItem_GetValue_String", ":Z",
                            reinterpret_cast<void *>(test_EnumItem_GetValue_String)},
        ani_native_function{"test_EnumItem_GetName", ":Z", reinterpret_cast<void *>(test_EnumItem_GetName)},
        ani_native_function{"test_EnumItem_GetIndex", ":Z", reinterpret_cast<void *>(test_EnumItem_GetIndex)},
        ani_native_function{"test_TupleValue_GetItem_Boolean", ":Z",
                            reinterpret_cast<void *>(test_TupleValue_GetItem_Boolean)},
        ani_native_function{"test_TupleValue_GetItem_Char", ":Z",
                            reinterpret_cast<void *>(test_TupleValue_GetItem_Char)},
        ani_native_function{"test_TupleValue_GetItem_Byte", ":Z",
                            reinterpret_cast<void *>(test_TupleValue_GetItem_Byte)},
        ani_native_function{"test_TupleValue_GetItem_Short", ":Z",
                            reinterpret_cast<void *>(test_TupleValue_GetItem_Short)},
        ani_native_function{"test_TupleValue_GetItem_Int", ":Z", reinterpret_cast<void *>(test_TupleValue_GetItem_Int)},
        ani_native_function{"test_TupleValue_GetItem_Long", ":Z",
                            reinterpret_cast<void *>(test_TupleValue_GetItem_Long)},
        ani_native_function{"test_TupleValue_GetItem_Float", ":Z",
                            reinterpret_cast<void *>(test_TupleValue_GetItem_Float)},
        ani_native_function{"test_TupleValue_GetItem_Double", ":Z",
                            reinterpret_cast<void *>(test_TupleValue_GetItem_Double)},
        ani_native_function{"test_TupleValue_GetItem_Ref", ":Z", reinterpret_cast<void *>(test_TupleValue_GetItem_Ref)},
        ani_native_function{"test_TupleValue_SetItem_Boolean", ":Z",
                            reinterpret_cast<void *>(test_TupleValue_SetItem_Boolean)},
        ani_native_function{"test_TupleValue_SetItem_Char", ":Z",
                            reinterpret_cast<void *>(test_TupleValue_SetItem_Char)},
        ani_native_function{"test_TupleValue_SetItem_Byte", ":Z",
                            reinterpret_cast<void *>(test_TupleValue_SetItem_Byte)},
        ani_native_function{"test_TupleValue_SetItem_Short", ":Z",
                            reinterpret_cast<void *>(test_TupleValue_SetItem_Short)},
        ani_native_function{"test_TupleValue_SetItem_Int", ":Z", reinterpret_cast<void *>(test_TupleValue_SetItem_Int)},
        ani_native_function{"test_TupleValue_SetItem_Long", ":Z",
                            reinterpret_cast<void *>(test_TupleValue_SetItem_Long)},
        ani_native_function{"test_TupleValue_SetItem_Float", ":Z",
                            reinterpret_cast<void *>(test_TupleValue_SetItem_Float)},
        ani_native_function{"test_TupleValue_SetItem_Double", ":Z",
                            reinterpret_cast<void *>(test_TupleValue_SetItem_Double)},
        ani_native_function{"test_TupleValue_SetItem_Ref", ":Z", reinterpret_cast<void *>(test_TupleValue_SetItem_Ref)},
        ani_native_function{"test_TupleValue_GetNumberOfItems", ":Z",
                            reinterpret_cast<void *>(test_TupleValue_GetNumberOfItems)},
        ani_native_function{"test_AttachCurrentThreadAndDetachCurrentThread", ":Z",
                            reinterpret_cast<void *>(test_AttachCurrentThreadAndDetachCurrentThread)},
        ani_native_function{"test_Promise_New", ":Z",
                            reinterpret_cast<void *>(test_Promise_New)},
        ani_native_function{"test_PromiseResolver_Resolve", ":Z",
                            reinterpret_cast<void *>(test_PromiseResolver_Resolve)},
        ani_native_function{"test_PromiseResolver_Reject", ":Z",
                            reinterpret_cast<void *>(test_PromiseResolver_Reject)},
        ani_native_function{"test_WeakReference_Delete", ":Z",
                            reinterpret_cast<void *>(test_WeakReference_Delete)},
    };
}

static ani_status bindCase(ani_vm *vm, const char *clsName)
{
    ani_env *env;
    if (ANI_OK != vm->GetEnv(ANI_VERSION_1, &env)) {
        std::cerr << "Unsupported ANI_VERSION_1" << std::endl;
        return (ani_status)ANI_RES_OUT_OF_REF;
    }

    ani_class cls{};
    if (ANI_OK != env->FindClass(clsName, &cls)) {
        std::cerr << "Not found '" << clsName << "'" << std::endl;
        return (ani_status)ANI_RES_INVALID_ARGS;
    }

    if (ANI_OK != env->Class_BindNativeMethods(cls, methods.data(), methods.size())) {
        std::cerr << "Cannot bind native methods to '" << clsName << "'" << std::endl;
        return (ani_status)ANI_RES_INVALID_TYPE;
    };
    return ANI_OK;
}

ANI_EXPORT ani_status ANI_Constructor(ani_vm *vm, uint32_t *result)
{
    std::cout << "testTag : entering libentry.so's ANI_Constructor" << std::endl;
    bindCase(vm, "Lentry/src/main/src/ets/Index/Foo;");
    *result = ANI_VERSION_1;
    return ANI_OK;
}